package code.juc.stopThread;

/**
 * 停止线程的最佳实践: (优先选择： 传递中断)
 *
 * 在catch语句中, 调用Thread.currentThread().interrupt()来恢复设置中断状态, 以便于在后续的执行中,
 * 依然能够检测到刚刚发生的中断.
 *
 * 解决思路:
 *  1. 在调用方法中, catch的时候, 调用Thread.currentThread().interrupt()来恢复设置中断状态.
 *  2. 但是在while中, 就需要判断线程是否被中断, 检测到中断的状态, 那么就退出线程.
 *
 *  屏蔽中断：就是方法自己对InterruptedException进行了捕获, 且, 没有重新调用中断, 导致外部线程不可知;
 *  是很危险的操作!!!!
 */
public class StopThreadInProd2 implements Runnable {
    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Thread is interrupted!");
                break;
            }

            returnInterrupt();
        }
    }

//    @lombok.SneakyThrows
    private void returnInterrupt() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new StopThreadInProd2());
        thread.start();
        Thread.sleep(500);
        thread.interrupt();
    }
}
